#include "TCP.h"

/*
int TCP_Init_Sever( in_port_t port , const char * s_addr);
功能:
    用于 IP 4 的TCP 服务器建立
参数:
    port 端口号
    s_addr ip地址
返回值:
    成功 返回 TCP 套接字 的结构体
    失败 返回 -1
*/
TCP_socket TCP_Init_Sever(in_port_t port, const char *s_addr)
{
    TCP_socket TCP_soc;
    // 1、创建套接字
    TCP_soc.sok_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == TCP_soc.sok_fd)
    {
        perror("socket error:");
        exit(-1);
    }

    // 2、填充服务器网络信息结构体
    struct sockaddr_in soc_addr_in;                  // 创建结构体
    soc_addr_in.sin_family = AF_INET;                // 结构体类型  IP4
    soc_addr_in.sin_port = htons(port);              // 端口号
    soc_addr_in.sin_addr.s_addr = inet_addr(s_addr); // IP地址
    socklen_t addrlen = sizeof(soc_addr_in);         // 结构体大小

    // 3、将套接字与服务器的网络信息结构体绑定

    if (-1 == bind(TCP_soc.sok_fd, (struct sockaddr *)&soc_addr_in, addrlen))
    {
        perror("bind error:");
        exit(-1);
    }

    // 4、将套接字设置成 监听状态
    if (-1 == listen(TCP_soc.sok_fd, 5))
    {
        perror("listen error:");
        exit(-1);
    }

    // 5、阻塞等待客户端连接 accept
    printf("等待客户端连接....\n");

    TCP_soc.acc_fd = accept(TCP_soc.sok_fd, NULL, NULL);
    if (-1 == TCP_soc.acc_fd)
    {
        perror("accept error:");
        close(TCP_soc.sok_fd);
        exit(-1);
    }

    printf("客户端连接成功....\n");
    return TCP_soc;
}

int TCP_Init_Client(in_port_t port, const char *s_addr)
{
    // 1、创建流式套接字
    int sok_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sok_fd)
    {
        perror("socket error:");
        exit(-1);
    }

    // 2、填充服务器网络信息结构体
    struct sockaddr_in soc_addr_in;                  // 创建结构体
    soc_addr_in.sin_family = AF_INET;                // 结构体类型  IP4
    soc_addr_in.sin_port = htons(port);              // 端口号
    soc_addr_in.sin_addr.s_addr = inet_addr(s_addr); // IP地址
    socklen_t addrlen = sizeof(soc_addr_in);         // 结构体大小

    // 3、与服务器建立连接 cnnect
    printf("等待服务器连接....\n");
    connect(sok_fd, (struct sockaddr *)&soc_addr_in, addrlen);
    printf("服务器连接成功....\n");
    sleep(1);

    // 返回套接字
    return sok_fd;
}

/*
void TCP_close_Sever(TCP_socket TCP_soc);
功能:
    用于 IP 4 的TCP 套接字销毁
参数:
    TCP_soc 套接字结构体
返回值:
    一定会成功
*/
void TCP_close_Sever(TCP_socket *TCP_Sever_soc, int *TCP_Client_soc)
{
    if (NULL == TCP_Sever_soc)
    {
        close(*TCP_Client_soc); //关闭客户端套接字
        return;
    }

    if (NULL == TCP_Client_soc)
    {
        close(TCP_Sever_soc->acc_fd); //关闭客户端套接字 因为是服务器 所以没有客户端套接字
        close(TCP_Sever_soc->sok_fd); //关闭监听套接字  
        return;
    }
}
